package be.groept.ace.cursusplanning.view;


import java.awt.Container;
import java.awt.event.*;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JComboBox;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import java.awt.Color;
import java.util.Iterator;
import java.util.List;

import Exceptions.PlanningException;
import be.groept.ace.cursusplanning.controller.*;
import be.groept.ace.cursusplanning.controller.PlanningController.Startuur;
import be.groept.ace.cursusplanning.model.*;

/**
 * 
 * @author P. FOX, Gouke Leplat
 *
 */

public class PlanningFrame extends JFrame{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private OpstartController opstartController;
	private PlanningController planningController;
	private String cursus;
	private String lector;
	private String lokaal;
	private String dag;
	private String tijdstip;
	private JLabel lblGepland, lblLectorVoorkeur;
	private JLabel lblStatusPlanning;
	private JButton btnRegistratie;
	private JComboBox cmbCursussen, cmbLectoren, cmbLokalen, cmbDagen, cmbUren, cmbPlaatsen;
	
	//private Application app = new Application();
	
	public PlanningFrame(OpstartController opstartController, PlanningController planningController){
		super("Planning cursussen schooljaar 2011-2012");
		this.opstartController = opstartController;
		this.planningController = planningController;
		Container container = getContentPane();
		container.setBackground(Color.YELLOW);
		container.setLayout(null);
		
		//cursussen - Deze moeten ingelezen worden uit de cursussen container!!!
		cmbCursussen = new JComboBox(opstartController.getDatabase().getCursussenarray());
		JLabel lblCursussen = new JLabel("Selecteer een cursus");
		lblCursussen.setBounds(20, 20, 300, 30);
		cmbCursussen.setBounds(20, 50, 300, 30);
		
		//cursusoverzicht
		lblGepland = new JLabel(getReedsGeplandTekst());
		lblGepland.setBounds(400,20,500,30);
		final JTextArea txtGepland  = new JTextArea(10,50);
		txtGepland.setText(getAangebodenCursusOverzichtTekst());
		txtGepland.setBounds(400,50,500,100);
		txtGepland.setEditable(false);
		
		//lectoren - Deze moeten ingelezen worden uit de lectoren container!!!
		cmbLectoren = new JComboBox(opstartController.getDatabase().getLectorenArray());
		JLabel lblLectoren = new JLabel("Selecteer een lector");
		lblLectoren.setBounds(20, 150, 300, 30);
		cmbLectoren.setBounds(20, 180, 300, 30);
		
		//lectorenoverzicht
		lblLectorVoorkeur = new JLabel(getLectorVoorkeurTekst());
		lblLectorVoorkeur.setBounds(400,150,500,30);
		final JTextArea txtLectorVoorkeur  = new JTextArea(10,50);
		txtLectorVoorkeur.setText(getLectorOverzichtTekst());
		txtLectorVoorkeur.setBounds(400,180,500,100);
		txtLectorVoorkeur.setEditable(false);
		
		//Lokalen
		cmbLokalen = new JComboBox(getLokalen());
		JLabel lblLokalen = new JLabel("Selecteer een lokaal");
		lblLokalen.setBounds(20, 280, 300, 30);
		cmbLokalen.setBounds(20, 310, 300, 30);
		

		//Dagen
		cmbDagen = new JComboBox(getDagen());
		cmbDagen.setMaximumRowCount(6);
		JLabel lblDag = new JLabel("Selecteer dag");
		lblDag.setBounds(20, 350, 200, 30);
		cmbDagen.setBounds(20, 380, 100, 30);
		
		//aanvangsuur cursus - Een cursus kan starten op het uur of het haluur - dynamisch aanpassen aan lesdag
		cmbUren = new JComboBox ();
		setBeginUren();
		cmbUren.setMaximumRowCount(7);
		JLabel lblTijd = new JLabel("Selecteer aanvangsuur");
		lblTijd.setBounds(220, 350, 300, 30);
		cmbUren.setBounds(220, 380, 180, 30);
		
		// aantal beschikbare plaatsen
		Integer [] plaatsen = {10,15,20,25};
		cmbPlaatsen = new JComboBox(plaatsen);
		cmbPlaatsen.setMaximumRowCount(4);
		JLabel lblPlaatsen = new JLabel("Beschikbare plaatsen");
		lblPlaatsen.setBounds(420, 350, 300, 30);
		cmbPlaatsen.setBounds(420, 380, 80, 30);
		
		//registratieknop
		btnRegistratie = new JButton(getRegistratieTekst());
		btnRegistratie.setBounds(20,440,900,30);
        //statusPlanning
		lblStatusPlanning = new JLabel();
		lblStatusPlanning.setForeground(Color.RED);
		lblStatusPlanning.setBounds(20,500,810,30);
		
		container.add(lblCursussen); container.add(cmbCursussen);
		container.add(lblLectoren); container.add(cmbLectoren);
		container.add(lblLokalen); container.add(cmbLokalen);
		container.add(lblDag); container.add(cmbDagen);
		container.add(lblTijd); container.add(cmbUren);
		container.add(lblPlaatsen); container.add(cmbPlaatsen);
		container.add(lblGepland); container.add(txtGepland);
		container.add(lblLectorVoorkeur); container.add(txtLectorVoorkeur);
		container.add(btnRegistratie);
		container.add(lblStatusPlanning);
		
		
		//eventhandlers
		cmbCursussen.addItemListener(new ItemListener()
		{
				public void itemStateChanged(ItemEvent event){
					btnRegistratie.setText(getRegistratieTekst());
					lblGepland.setText(getReedsGeplandTekst());
					lblLectorVoorkeur.setText(getLectorVoorkeurTekst());
					lblStatusPlanning.setText("");
					txtLectorVoorkeur.setText(getLectorOverzichtTekst());
					txtGepland.setText(getAangebodenCursusOverzichtTekst());
					setBeginUren();
				}
		});
		cmbLectoren.addItemListener(new ItemListener()
	    {
			public void itemStateChanged(ItemEvent event){
				btnRegistratie.setText(getRegistratieTekst());
				lblStatusPlanning.setText("");
			}
	    });
		cmbLokalen.addItemListener(new ItemListener()
	    {
			public void itemStateChanged(ItemEvent event){
				btnRegistratie.setText(getRegistratieTekst());
				lblStatusPlanning.setText("");
			}
	    });
		cmbDagen.addItemListener(new ItemListener()
	    {
			public void itemStateChanged(ItemEvent event){
				btnRegistratie.setText(getRegistratieTekst());
				setBeginUren();
				lblStatusPlanning.setText("");
			}
	    });
		
		cmbUren.addItemListener(new ItemListener()
	    {
			public void itemStateChanged(ItemEvent event){
				btnRegistratie.setText(getRegistratieTekst());
				lblStatusPlanning.setText("");
			}
	    });
		
		btnRegistratie.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent event){
				
				planCursus();
				txtGepland.setText(getAangebodenCursusOverzichtTekst());
			}
		});
		this.addWindowListener(new WindowAdapter()  
		{	          
 			public void windowClosing(WindowEvent e){  
 				setVisible(false);             
 				toonMenu();
 			}	
		});
		this.setSize(1000, 750);
		
	}

	// METHODS
	
	private void planCursus(){

		Cursus cursus = (Cursus) cmbCursussen.getSelectedItem();

		try{
			boolean success = 
			planningController.requestPlanning(cursus,
												(Lokaal) cmbLokalen.getSelectedItem(), 
												(Lector) cmbLectoren.getSelectedItem(),
												((Startuur) cmbUren.getSelectedItem()).getTijdsMoment(),
												((Integer) cmbPlaatsen.getSelectedItem()).intValue(),
												2012 );  // TODO schooljaar !!
			
			if (success == true){
				lblStatusPlanning.setText("De cursus is gepland");

			}
			else lblStatusPlanning.setText ("Het opslagen is mislukt");
		}
		catch (PlanningException e){
			lblStatusPlanning.setText(e.getMessage());
		}
		catch (IllegalArgumentException ie){
			lblStatusPlanning.setText(ie.getMessage());
		}
	}

	
	// COMBO BOX FILLERS

	private String getAangebodenCursusOverzichtTekst(){
		String output = "";
		
		if (cmbCursussen.getSelectedIndex() == -1){
			return "Geen Cursus geselecteerd.";
		}
		
		List<AangebodenCursus> aanbodCursus = ((Cursus) cmbCursussen.getSelectedItem()).getAangebodenCursussen();
		
		if (aanbodCursus.size() == 0 ) return "Geen cursussen ingericht voor " + ((Cursus)cmbCursussen.getSelectedItem()).getCursusNaam();
		for (AangebodenCursus Ac : aanbodCursus){
			output += Ac.getTijdsMoment1Dag().getDag().toString() + " van  " + Ac.getTijdsMoment1Dag().getBegintijd() + " tot " + Ac.getTijdsMoment1Dag().getEindtijd()
					+ " Lok: " + Ac.getLokaal().toString() + " plaatsen: " + (Ac.getAantalPlaatsen() - Ac.getInschrijvingen().size()) +  "/"  + Ac.getAantalPlaatsen() + "\n"; 
		}
		
		return output;
	}

	private LesDag[] getDagen(){ 
		
		LesDag [] dagen = new LesDag[LesDag.values().length];
		int dag = 0;
		for (LesDag d: LesDag.values()){
			dagen[dag] = d;
			dag++;
		}
		return dagen;
	}
	
	private String getLectorOverzichtTekst(){

		String output = "";
		
		if (cmbCursussen.getSelectedIndex() == -1) return "geen cursus geselecteerd";
		
		Cursus cursus = (Cursus) cmbCursussen.getSelectedItem();
		List<AangebodenCursus> aangebodenCursussen = cursus.getAangebodenCursussen();
		
		int aantalUren = 0;
		
		
		// bij elke lector nagaan of die lector de aangeduide cursus als cursusvoorkeur heeft
		// vervolgens nagaan hoeveel uren deze lector al gekopeld is aan opdrachten
		// als laatste kijken of er nog tijd overscheit t.o.v. gewenste aantal uren
		
		List<Lector> lecs = opstartController.getDatabase().getLectoren().getAll();
		Lector l;
		AangebodenCursus AC;
		
		Iterator<Lector> itLector = lecs.iterator();
		
		while (itLector.hasNext()){
			
			l = itLector.next();
			
			if (l.getCursusVoorkeur().equals(cursus)){
				aantalUren = 0;
				Iterator<AangebodenCursus> itAC = aangebodenCursussen.iterator();
				
				while (itAC.hasNext()){
				
					AC = itAC.next();
					if (AC.getLector().equals(l)){
						aantalUren += AC.getTijdsMoment1Dag().getDuurInMinuten() / 60;
					}
				}
			
			
				if (l.getAantalGewensteUren() > aantalUren){
					output += l.getLectorCode() + " " + l.getLectorNaam() + " - Resterend aantal uren: " + (l.getAantalGewensteUren() - aantalUren) 
							+ " - lestijden per week: " + (cursus.getLestijdPerWeek()/60)	+ " --> ";
					if (aantalUren + cursus.getLestijdPerWeek()/60 > l.getAantalGewensteUren()){
						output += "Niet OK\r";
					}
					else{
						output += "OK\r";
					}
						
				}
			}
			
		}
		
		return output;
	}
	
	private String getLectorVoorkeurTekst(){
		return "Overzicht beschikbare lectoren met voorkeur voor " + cmbCursussen.getSelectedItem();
	}
	
	private Lokaal[] getLokalen(){
		Lokaal[] lokalen = new Lokaal[Lokaal.values().length];
		int lokaal = 0;
		
		for (Lokaal l : Lokaal.values()){
			
			lokalen[lokaal] = l;
			lokaal++;
		}
		return lokalen;
	}
	
	private String getReedsGeplandTekst(){
		return "Overzicht reeds geplande cursussen voor " + cmbCursussen.getSelectedItem();
	}
	
	private String getRegistratieTekst(){
		cursus = ""+cmbCursussen.getSelectedItem();
		lector = ""+cmbLectoren.getSelectedItem();
		lokaal = ""+cmbLokalen.getSelectedItem();
		dag = ""+cmbDagen.getSelectedItem();
		tijdstip = ""+cmbUren.getSelectedItem();
		return "Registreer:"+" CURSUS: "+cursus+"\n"+
		                      "   LECTOR: "+lector+
		                      "   LOKAAL: "+lokaal+
		                      "   DAG: "+dag+
		                      "   AANVANG: "+tijdstip;
		     
		
	}
	
	private void setBeginUren(){
		
		cmbUren.removeAllItems();
		
		
		if(cmbCursussen.getSelectedItem() != null && cmbDagen.getSelectedIndex() > -1){
			Startuur[] uren = planningController.getMogelijkeTijdstippen((Cursus)cmbCursussen.getSelectedItem(),(LesDag) cmbDagen.getSelectedItem());
			for (Startuur start : uren){
				cmbUren.addItem(start);
			}
		}
	
	}

	private void toonMenu(){
		opstartController.execute();
	}

}
